package es.uma.scgt.modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "peticion")
public class Peticion implements Serializable {

	private static final long serialVersionUID = -851335504335546302L;

	@Id
	@GeneratedValue
	@Column(name = "id")
	private Integer id;

	@Size(max = 500)
	@Column(name = "descripcion")
	private String descripcion;

	// Join con Usuario
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(nullable = false)
	private Usuario emisor;

	// Join con Equipo
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(nullable = false)
	private Equipo receptor;

	@NotNull
	@Column(name = "fEnvio")
	private Date fechaEnvio;

	@Column(name = "fEntrega")
	private Date fechaEntrega;

	@Column(name = "titulo")
	@Size(max = 100)
	private String titulo;

	@Enumerated(EnumType.STRING)
	private FaseP fase;
	
	// Lazy
	@OneToMany(fetch = FetchType.LAZY, mappedBy =  "peticion")
	private List<Tarea> tareas;

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public FaseP getFase() {
		return fase;
	}

	public void setFase(FaseP fase) {
		this.fase = fase;
	}

	/**
	 * @return the id
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @return the descripcion
	 */
	public String getDescripcion() {
		return descripcion;
	}

	/**
	 * @param descripcion
	 *            the descripcion to set
	 */
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	/**
	 * @return the emisor
	 */
	public Usuario getEmisor() {
		return emisor;
	}

	/**
	 * @param usuario
	 *            the emisor to set
	 */
	public void setEmisor(Usuario usuario) {
		this.emisor = usuario;
	}

	/**
	 * @return the receptor
	 */
	public Equipo getReceptor() {
		return receptor;
	}

	/**
	 * @param receptor
	 *            the receptor to set
	 */
	public void setReceptor(Equipo receptor) {
		this.receptor = receptor;
	}

	/**
	 * @return the fechaEnvio
	 */
	public Date getFechaEnvio() {
		return fechaEnvio;
	}

	/**
	 * @param fechaEnvio
	 *            the fechaEnvio to set
	 */
	public void setFechaEnvio(Date fechaEnvio) {
		this.fechaEnvio = fechaEnvio;
	}

	/**
	 * @return the fechaEntrega
	 */
	public Date getFechaEntrega() {
		return fechaEntrega;
	}

	/**
	 * @param fechaEntrega
	 *            the fechaEntrega to set
	 */
	public void setFechaEntrega(Date fechaEntrega) {
		this.fechaEntrega = fechaEntrega;
	}

	/**
	 * @return the tarea
	 */
	public List<Tarea> getTareas() {
		return tareas;
	}

	/**
	 * @param tarea
	 *            the tarea to set
	 */
	public void setTareas(List<Tarea> tarea) {
		this.tareas = tarea;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((descripcion == null) ? 0 : descripcion.hashCode());
		result = prime * result + ((emisor == null) ? 0 : emisor.hashCode());
		result = prime * result
				+ ((fechaEntrega == null) ? 0 : fechaEntrega.hashCode());
		result = prime * result
				+ ((fechaEnvio == null) ? 0 : fechaEnvio.hashCode());
		result = prime * result + id;
		result = prime * result
				+ ((receptor == null) ? 0 : receptor.hashCode());
		result = prime * result + ((tareas == null) ? 0 : tareas.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Peticion other = (Peticion) obj;
		if (descripcion == null) {
			if (other.descripcion != null)
				return false;
		} else if (!descripcion.equals(other.descripcion))
			return false;
		if (emisor == null) {
			if (other.emisor != null)
				return false;
		} else if (!emisor.equals(other.emisor))
			return false;
		if (fechaEntrega == null) {
			if (other.fechaEntrega != null)
				return false;
		} else if (!fechaEntrega.equals(other.fechaEntrega))
			return false;
		if (fechaEnvio == null) {
			if (other.fechaEnvio != null)
				return false;
		} else if (!fechaEnvio.equals(other.fechaEnvio))
			return false;
		if (id != other.id)
			return false;
		if (receptor == null) {
			if (other.receptor != null)
				return false;
		} else if (!receptor.equals(other.receptor))
			return false;
		if (tareas == null) {
			if (other.tareas != null)
				return false;
		} else if (!tareas.equals(other.tareas))
			return false;
		return true;
	}

}